/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.DAOS;

import Controladores.CtrlCrearGrupo;
import DataTypes.DataComentario;
import DataTypes.DataContenido;
import DataTypes.DataEvento;
import DataTypes.DataGrupo;
import DataTypes.DataUsuario;
import Hndlr.HndlrGrupo;
import Interfaces.Factory;
import Interfaces.ICtrlAgregarEntradaMuro;
import Persistencia.CtrlPersistencia;
import com.csvreader.CsvReader;
import com.csvreader.CsvWriter;
import enums.EnumAprob;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;

/**
 *
 * @author Usuario
 */
public class DAOContenidos {
    
    
    public void guardarEventos(ArrayList<DataUsuario> listU,String pathDirect){
       
        String ruta = (pathDirect+"\\eventos.csv");
       
        try {
            CsvWriter writer = new CsvWriter(ruta);
            writer.write("nombre");
            writer.write("tipoEvento");
            writer.write("repetible");
            writer.write("fecha");
            writer.write("asociadoA");
            writer.write("autor");
            
            ArrayList<DataGrupo> listG = HndlrGrupo.getInstance().listarGrupos();
            Iterator<DataGrupo> itG = listG.iterator();
            HashMap<String, DataEvento> calEventos;
            Iterator<DataEvento> itEven;
            Iterator<DataUsuario> it = listU.iterator();
            DataEvento de;
            DataGrupo dg;
            DataUsuario usu;
            while (it.hasNext()) {
                
                usu = it.next();
                calEventos = usu.getCalEventos();
                itEven = calEventos.values().iterator();
              
                    while (itEven.hasNext()) {

                    writer.endRecord();
                    de = itEven.next();
                    writer.write(de.getNombre());
                    writer.write(de.getTipo().toString());
                    if (de.isRepetible()) {
                        writer.write("true");
                    } else {
                        writer.write("false");
                    }
                    if (!de.isRepetible()) {
                        int dia = de.getFecha().get(Calendar.DAY_OF_MONTH);
                        int mes = de.getFecha().get(Calendar.MONTH)+1;
                        int anio = de.getFecha().get(Calendar.YEAR);
                        int hora = de.getFecha().get(Calendar.HOUR_OF_DAY);
                        int min = de.getFecha().get(Calendar.MINUTE);
                        writer.write(dia + "-" + mes + "-" + anio+"-"+hora+":"+min);
                    } else {
                        ArrayList<String> arr = de.getDiasDeSemana();
                        Iterator<String> itarr = arr.iterator();
                        String cad = "";
                        while (itarr.hasNext()) {
                            cad = cad.concat(itarr.next() + ";");

                        }
                        writer.write(cad);
                    }
                    writer.write(usu.getCorreo());
                    writer.write(de.getAutor().getCorreo());
                    

                }

            }
            
            while (itG.hasNext()) {
                
                dg = itG.next();
                calEventos = dg.getCalEventos();
                itEven = calEventos.values().iterator();
              
                    while (itEven.hasNext()) {

                    writer.endRecord();
                    de = itEven.next();
                    writer.write(de.getNombre());
                    writer.write(de.getTipo().toString());
                    if (de.isRepetible()) {
                        writer.write("true");
                    } else {
                        writer.write("false");
                    }
                    if (!de.isRepetible()) {
                        
                        int dia = de.getFecha().get(Calendar.DAY_OF_MONTH);
                        int mes = de.getFecha().get(Calendar.MONTH);
                        int anio = de.getFecha().get(Calendar.YEAR);
                        int hora = de.getFecha().get(Calendar.HOUR_OF_DAY);
                        int min = de.getFecha().get(Calendar.MINUTE);
                        writer.write(dia + "-" + mes + "-" + anio+"-"+hora+":"+min);
                    } else {
                        ArrayList<String> arr = de.getDiasDeSemana();
                        Iterator<String> itarr = arr.iterator();
                        String cad = "";
                        while (itarr.hasNext()) {
                            cad = cad.concat(itarr.next() + ";");

                        }
                        writer.write(cad);
                    }
                    writer.write(dg.getNombre());
                    writer.write(de.getAutor().getCorreo());

                }

            }
            writer.close();


        } catch (IOException ex) {
            Logger.getLogger(CtrlPersistencia.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void guardarContenidosUsuarios(ArrayList<DataUsuario> listU,String path) {

           String ruta = (path+"\\contenidos.csv");
        try {
        ArrayList<DataGrupo> listG = new  CtrlCrearGrupo().listarGrupos();
        Iterator<DataGrupo> itG = listG.iterator();
        Iterator<DataUsuario> it = listU.iterator();
        Iterator<DataContenido> itC;
        DataContenido dt;
        DataUsuario du;
        DataGrupo dg;
        
        CsvWriter coment = new CsvWriter(path+"\\comentarios.csv");
                coment.write("texto");
                coment.write("fecha");
                coment.write("puntos");
                coment.write("autor");
                coment.write("asociadoA");
        
        CsvWriter writer = new CsvWriter(ruta);
        writer.write("Referencia");
        writer.write("FechaPublicacion");
        writer.write("Autor");
        writer.write("Titulo");
        writer.write("Extension");
        writer.write("Cuerpo");
        writer.write("Url");
        writer.write("bloqueo");
        writer.write("Publicar");
        writer.write("Aprobacion");
        
            while (it.hasNext()) {
                
                du = it.next();
                itC = du.getMuro().getContenidos().iterator();

                while (itC.hasNext()) {

                    dt = itC.next();
                    writer.endRecord();
                    writer.write(dt.getTitulo() + dt.getFechaPublicacion().getTime().toString());
                        
                        int dia = dt.getFechaPublicacion().get(Calendar.DAY_OF_MONTH);
                        int mes = dt.getFechaPublicacion().get(Calendar.MONTH);
                        int anio = dt.getFechaPublicacion().get(Calendar.YEAR);
                        int hora = dt.getFechaPublicacion().get(Calendar.HOUR_OF_DAY);
                        int min = dt.getFechaPublicacion().get(Calendar.MINUTE);
                    
                    writer.write(dia + "-" + mes + "-" + anio+"-"+hora+":"+min);
                    writer.write(dt.getAutor().getCorreo());
                    writer.write(dt.getTitulo());
                    writer.write(dt.getTipo());
                    writer.write(dt.getCuerpo());
                    writer.write(dt.getUrl());
                    writer.write(String.valueOf(dt.isBloqueado()));
                    if(dt.isPublicar())
                        writer.write("true");
                    else 
                        writer.write("false");
                    writer.write(dt.getAprobacion().toString());
                    guardarComentarios(dt,path,coment);
                    if (dt.getTipo().equals("Imagen")){
                        guardarEtiquetas(dt, path, du.getCorreo(), false);
                    }
                    
                }

            }

              while (itG.hasNext()) {
                
                dg = itG.next();
                itC = dg.getMuro().getContenidos().iterator();

                while (itC.hasNext()) {

                    dt = itC.next();
                    writer.endRecord();
                    writer.write(dt.getTitulo() + dt.getFechaPublicacion().getTime().toString());
                    int dia = dt.getFechaPublicacion().get(Calendar.DAY_OF_MONTH);
                        int mes = dt.getFechaPublicacion().get(Calendar.MONTH);
                        int anio = dt.getFechaPublicacion().get(Calendar.YEAR);
                        int hora = dt.getFechaPublicacion().get(Calendar.HOUR_OF_DAY);
                        int min = dt.getFechaPublicacion().get(Calendar.MINUTE);
                    
                    writer.write(dia + "-" + mes + "-" + anio+"-"+hora+":"+min);
                    writer.write(dt.getAutor().getCorreo());
                    writer.write(dt.getTitulo());
                    writer.write(dt.getTipo());
                    writer.write(dt.getCuerpo());
                    writer.write(dt.getUrl());
                    writer.write(String.valueOf(dt.isBloqueado()));
                     if(dt.isPublicar())
                        writer.write("true");
                    else 
                        writer.write("false");
                     writer.write(dt.getAprobacion().toString());
                    guardarComentarios(dt,path,coment);
                }

            }
            
            writer.close();
            coment.close();
        } catch (IOException ex) {
            Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

    public void guardarComentarios(DataContenido dc,String path,CsvWriter writer){
        
        String ruta = path+"\\comentarios.csv";
        ArrayList<DataComentario> listC = dc.getComentarios();
        Collections.reverse(listC);
        DataComentario datc;
        Iterator<DataComentario> itC = listC.iterator();
    try {
                      
                while(itC.hasNext()){
                    
                    datc = itC.next();
                    writer.endRecord();
                    writer.write(datc.getTexto());
                    int dia = datc.getFecha().get(Calendar.DAY_OF_MONTH);
                        int mes = datc.getFecha().get(Calendar.MONTH);
                        int anio = datc.getFecha().get(Calendar.YEAR);
                        int hora = datc.getFecha().get(Calendar.HOUR_OF_DAY);
                        int min = datc.getFecha().get(Calendar.MINUTE);
                        int seg = datc.getFecha().get(Calendar.SECOND);
                    
                    writer.write(dia + "-" + mes + "-" + anio+"-"+hora+":"+min+":"+seg);
                    writer.write(String.valueOf(datc.getPuntos()));
                    writer.write(datc.getUsr().getCorreo());
                    writer.write(dc.getTitulo()+dc.getFechaPublicacion().getTime().toString());
                }
                
                
                
            } catch (IOException ex) {
                Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
    
    
    public DataContenido cargarContenidos(String ref,String path) {

        String ruta = path+"\\contenidos.csv";
        DataContenido dc = null;
        {
            Date date = null;
            try {
                CsvReader amistad = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
                amistad.readHeaders();
                while (amistad.readRecord() && !amistad.get("Referencia").equals(ref)) {

                    ;

                }
                String referencia = amistad.get("Referencia");
                String titulo = amistad.get("Titulo");
                String extension = amistad.get("Extension");
                String cuerpo = amistad.get("Cuerpo");
                String url = amistad.get("Url");
                String fecha = amistad.get("FechaPublicacion");
                String autor = amistad.get("Autor");
                String bloqueo = amistad.get("bloqueo");
                EnumAprob aprob = EnumAprob.valueOf(amistad.get("Aprobacion"));
                dc= new DataContenido(titulo, null, url, cuerpo, titulo, EnumAprob.APROBADO, true, null, null, true, null);
                dc.setTipo(titulo);
                dc.setAutor(Factory.getInstance().getUsuarios().getUsuario(autor));
                dc.setUrl(url);
                dc.setCuerpo(cuerpo);
                dc.setTipo(extension);
                dc.setAprobacion(aprob);
                if(bloqueo.equals("true"))
                    dc.setBloqueado(true);
                else
                    dc.setBloqueado(false);
                dc.setFechaPublicacion(null);
                DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy-HH:mm");
                date = dateforma.parse(fecha);
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                dc.setFechaPublicacion(cal);
                ArrayList<DataComentario> list = cargarComentarios(referencia,path);
                Collections.reverse(list);
                dc.setComentarios(list);
                boolean pub;
                if(amistad.get("Publicar").equals("true"))
                    pub = true;
                else pub = false;
                dc.setPublicar(pub);
                amistad.close();
                
            } catch (ParseException ex) {
                Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
            }catch (IOException ex) {
               Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
           } 
        }
        
        return dc;
    }
    
    public ArrayList<DataComentario> cargarComentarios(String ref,String path){
       
        String ruta = path+"\\comentarios.csv";
        ArrayList<DataComentario> listC = new ArrayList<DataComentario>();
        try {
            CsvReader coment = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
            coment.readHeaders();
            
            while(coment.readRecord()){
                
                String asoc = coment.get("asociadoA");
                if(coment.get("asociadoA").equals(ref))
                {
                    String texto  = coment.get("texto");
                    String fecha  = coment.get("fecha");
                    String puntos  = coment.get("puntos");
                    String autor  = coment.get("autor");

                    DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy-HH:mm:ss");
                    Date date = dateforma.parse(fecha);
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(date);
                    
                    DataComentario datC = new DataComentario(texto,cal, Integer.parseInt(puntos),Factory.getInstance().getUsuarios().getUsuario(autor));
                    listC.add(datC);
                }
                
            }
            
            coment.close();
        } catch (ParseException ex) {
            Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
        }
    return listC;    
      
    }

    private void guardarEtiquetas(DataContenido dt, String path, String idMuro, boolean esGrupo) {
        try {
            String ruta = path+"\\etiquetas.csv";
            CsvWriter etiqFile = new CsvWriter(ruta);
                    etiqFile.write("titCont");
                    etiqFile.write("fecha");
                    etiqFile.write("correoUsr");
                    etiqFile.write("idmuro");
                    etiqFile.write("esGrupo");
            ArrayList<DataUsuario> listC = dt.getEtiquetas();
            //Collections.reverse(listC);
            DataUsuario datc;
            Iterator<DataUsuario> itC = listC.iterator();
            try {
                          
                    while(itC.hasNext()){
                        datc = itC.next();
                        etiqFile.endRecord();
                        int dia = dt.getFechaPublicacion().get(Calendar.DAY_OF_MONTH);
                        int mes = dt.getFechaPublicacion().get(Calendar.MONTH);
                        int anio = dt.getFechaPublicacion().get(Calendar.YEAR);
                        int hora = dt.getFechaPublicacion().get(Calendar.HOUR_OF_DAY);
                        int min = dt.getFechaPublicacion().get(Calendar.MINUTE);
                        
                        etiqFile.write(dt.getTitulo());
                        etiqFile.write(dia + "-" + mes + "-" + anio+"-"+hora+":"+min);
                        etiqFile.write(datc.getCorreo());
                        etiqFile.write(idMuro);
                        if (esGrupo){
                            etiqFile.write("true");
                        } else {
                            etiqFile.write("false");
                        }
                    }
                    
                } catch (IOException ex) {
                    Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
                }
                etiqFile.close();
        } catch (IOException ex) {
                Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void cargarEtiquetas(String path) {
        String ruta = path+"\\etiquetas.csv";
        try {
            CsvReader etiquetas = new CsvReader(new InputStreamReader(new FileInputStream(ruta), "UTF-8"));
            etiquetas.readHeaders();
            
            ICtrlAgregarEntradaMuro ctrlAgregarEntrada = Factory.getInstance().getAgregarEntradaMuro();
            
            while (etiquetas.readRecord()){
                String titCont = etiquetas.get("titCont");
                String fecha = etiquetas.get("fecha");
                String correoUsr = etiquetas.get("correoUsr");
                String idmuro = etiquetas.get("idmuro");
                String esGrupoStr = etiquetas.get("esGrupo");
                
                boolean esGrupo = false;
                if (esGrupoStr.equals("true")){
                    esGrupo = true;
                }
                
                ArrayList<String> etiquetado = new ArrayList<String>();
                etiquetado.add(correoUsr);
                Date date = new Date();
                DateFormat dateforma = new SimpleDateFormat("dd-MM-yyyy-HH:mm");
                try {
                    date = dateforma.parse(fecha);
                } catch (ParseException ex) {
                    Logger.getLogger(DAOContenidos.class.getName()).log(Level.SEVERE, null, ex);
                }
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                
                ctrlAgregarEntrada.etiquetarImagen(titCont, cal, idmuro, etiquetado, esGrupo);
                
            }
            
        } catch (IOException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
}